package com.heyou.tools;

import com.heyou.pojo.Appointment;
import com.heyou.service.AppointmentService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class AppointmentTools {

    @Resource
    private AppointmentService appointmentService;

    @Tool(name = "预约挂号", value = "根据参数，先执行工具方法queryDepartment查询是否可预约，并直接给用户回答是否可预约，让用户确认所有预约信息，用户确认后再进行预约。若用户没有提供具体的医生姓名，请从向量存储库内指定一位医生。")
    public String bookAppointment(Appointment appointment) {
        Appointment one = appointmentService.getOne(appointment);
        if (ObjectUtils.isEmpty(one)) {
            appointment.setId(null);
            if (appointmentService.save(appointment)) {
                return "预约成功，并返回详情信息。";
            } else {
                return "预约失败。";
            }
        }
        return "您在相同的时间和科室已有预约。";
    }

    @Tool(name = "取消预约", value = "根据参数，查询预约是否存在，如果存在则删除预约记录并返回取消预约成功，否则返回取消预约失败。")
    public String cancelAppointment(Appointment appointment) {
        Appointment one = appointmentService.getOne(appointment);
        if (ObjectUtils.isNotEmpty(one)) {
            if (appointmentService.removeById(one.getId())) {
                return "取消预约成功";
            } else {
                return "取消预约失败";
            }
        }
        return "您没有预约记录，请核对预约科室及时间。";
    }

    @Tool(name = "查询是否有号源", value="根据科室名称，日期，时间和医生查询是否有号源，并返回给用户")
    public boolean queryDepartment(@P(value = "科室名称") String name,
                                   @P(value = "预约日期") String date,
                                   @P(value = "预约时间，可选值：上午、下午") String time,
                                   @P(value = "医生姓名") String doctorName) {
        log.info("查询是否有号源");
        log.info("科室名称：{}", name);
        log.info("日期：{}", date);
        log.info("时间：{}", time);
        log.info("医生名称：{}", doctorName);
        // TODO 维护医生的排班信息：
        // 如果没有指定医生名字，则根据其他条件查询是否有可以预约的医生（有返回true，否则返回        false）；
        // 如果指定了医生名字，则判断医生是否有排班（没有排版返回false）
        // 如果有排班，则判断医生排班时间段是否已约满（约满返回false，有空闲时间返回true）
        return true;
    }
}
